💯 solving-algo | March 29, 2021
서로 다른 길이의 떡볶이를 H 길이만큼 잘라 더한 값이 손님이 주문한 M 길이가 될 수 있는지 확인하는 문제(H의 최대 길이를 구해야 한다.)
n, m = map(int, input().split())
arr = list(map(int, input().split()))
start = 0
end = max(arr)
# 이진 탐색 수행(반복적)
result = 0
while start <= end:
total = 0
mid = (start + end) // 2
for x in arr:
# 잘랐을 때의 떡의 양 계산
if x > mid:
total += x - mid
# 떡의 양이 부족한 경우 더 많이 자르기(왼쪽 부분 탐색)
if total < m:
end = mid - 1
# 떡의 양이 충분한 경우 덜 자르기(오른쪽 부분 탐색)
else:
result = mid # 최대한 덜 잘랐을 때가 정답이므로, 여기에서 result에 기록
start = mid + 1
print(result)
max(arr)
와, 0
의 중간 값 (mid
))를 잘라 더한 뒤 값이 부족할 경우 중간 값을 줄여 total
의 값을 증가시킨다.(mid + 1)
total의 값을 최대한 감소시킨다. 즉, H의 길이가 최대가 된다.